/*
  更好的Unicode支持
    早期，由于存储空间宝贵，Unicode使用16位二进制来存储文字，我们将一个16位的二进制编码叫做一个码元(Code Unit)

    后来，由于技术的发展，Unicode对文字编码进行了扩展，将某些文字扩展到了32位（占用两个码元），并且将某个文字对应
      的二进制数字叫做码点（Code Point）

    ES6为了解决这个困扰，位字符串提供了方法：codePointAt, 根据字符串码元的位置得到其码点

    同时ES6位正则表达式添加了flag：u，如果添加了该配置，则匹配时，使用码点匹配
*/

const text = "𠮷";
console.log("字符串长度：", text.length);
console.log("使用正则测试：", /^.$/u.test(text));
console.log("得到第一个码元：", text.charCodeAt(0));
console.log("得到第二个码元：", text.charCodeAt(1));

console.log("得到第一个码点：", text.codePointAt(0));
console.log("得到第二个码点：", text.codePointAt(1));

function is32bit(char, i = 0) {
  // 如果码点大于了16位二进制的最大值，则其实是32位
  return char.codePointAt(i) > 0xffff;
}

function getLenthOfCodePoint(str) {
  let len = 0;
  for (let i = 0; i < str.length; i++) {
    if (is32bit(str, i)) {
      i++;
    }
    len++;
  }
  return len;
}
console.log(getLenthOfCodePoint("ab𠮷ab"));
console.log(is32bit(text));
